//package com.dsl.dslsuzhou.controller;
//
//import com.dsl.dslsuzhou.mapper.DeviceExportRepository;
//import com.dsl.dslsuzhou.model.entity.Device;
//import com.dsl.dslsuzhou.service.ExportService;
//import com.mybatisflex.core.paginate.Page;
//import com.mybatisflex.core.query.QueryWrapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.util.StringUtils;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
//
///**
// * 设备导出控制器
// * 基于JdbcTemplate查询 + 导出服务
// */
//@RestController
//@RequestMapping("/devices")
//@Slf4j
//public class DeviceExportController {
//
//    @Autowired
//    private ExportService exportService;
//
//    @Autowired
//    private DeviceExportRepository deviceExportRepository;
//
//    /**
//     * 导出设备数据（小数据量）
//     */
//    @GetMapping("/export")
//    public void exportDevices(
//            @RequestParam(required = false) String category,
//            @RequestParam(required = false) String deviceType,
//            @RequestParam(required = false) String deviceName,
//            @RequestParam(required = false) String dateFrom,
//            @RequestParam(required = false) String dateTo,
//            HttpServletResponse response) {
//
//        try {
//            log.info("开始导出设备数据: category={}, deviceType={}, deviceName={}",
//                    category, deviceType, deviceName);
//
//            // 1. 使用JdbcTemplate查询数据
//            List<Device> devices = deviceExportRepository.queryAllDevices(category, deviceType, deviceName, dateFrom, dateTo);
//
//            // 转换为Object列表以适配导出服务
//            List<Object> deviceObjects = new ArrayList<>(devices);
//
//            // 2. 设置响应头
//            setupResponseHeaders(response, "devices");
//
//            // 3. 调用导出服务
//            exportService.export(deviceObjects, "devices", response.getOutputStream());
//
//        } catch (Exception e) {
//            log.error("导出设备数据失败", e);
//            handleError(response, "导出失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 导出设备数据（大数据量，分批处理）
//     */
//    @GetMapping("/export-batch")
//    public void exportDevicesBatch(
//            @RequestParam(required = false) String category,
//            @RequestParam(required = false) String deviceType,
//            @RequestParam(required = false) String deviceName,
//            @RequestParam(required = false) String dateFrom,
//            @RequestParam(required = false) String dateTo,
//            HttpServletResponse response) {
//
//        try {
//            log.info("开始分批导出设备数据: category={}, deviceType={}, deviceName={}",
//                    category, deviceType, deviceName);
//
//            // 1. 创建分批数据迭代器
//            Iterable<List<?>> dataIterator = createBatchIterator(category, deviceType, deviceName, dateFrom, dateTo);
//
//            // 2. 设置响应头
//            setupResponseHeaders(response, "devices");
//
//            // 3. 调用分批导出服务
//            exportService.exportBatch(dataIterator, "devices", response.getOutputStream());
//
//        } catch (Exception e) {
//            log.error("分批导出设备数据失败", e);
//            handleError(response, "导出失败: " + e.getMessage());
//        }
//    }
//
//    /**
//     * 查询设备数据（模拟实现）
//     * 实际项目中应该调用DeviceService和MyBatis-Flex
//     */
//    private List<Object> queryDevices(String category, String deviceType, String deviceName,
//                                     String dateFrom, String dateTo) {
//
//
//        QueryWrapper queryWrapper = QueryWrapper.create()
//            .and(DEVICE.DEVICE_CATEGORY.eq(category, StringUtils.hasText(category)))
//            .and(DEVICE.DEVICE_TYPE.eq(deviceType, StringUtils.hasText(deviceType)))
//            .and(DEVICE.DEVICE_NAME.like(deviceName, StringUtils.hasText(deviceName)))
//            .and(DEVICE.CREATED_AT.ge(dateFrom, StringUtils.hasText(dateFrom)))
//            .and(DEVICE.CREATED_AT.le(dateTo, StringUtils.hasText(dateTo)))
//            .and(DEVICE.DELETED.eq(0)); // 过滤逻辑删除
//
//        return deviceMapper.selectListByQuery(queryWrapper);
//    }
//
//    /**
//     * 创建分批数据迭代器（模拟实现）
//     */
//    private Iterable<List<?>> createBatchIterator(String category, String deviceType, String deviceName,
//                                                 String dateFrom, String dateTo) {
//
//        // 实际实现应该是：
//
//        return new Iterable<List<?>>() {
//            @Override
//            public Iterator<List<?>> iterator() {
//                return new Iterator<List<?>>() {
//                    private int currentPage = 1;
//                    private final int pageSize = 5000;
//                    private boolean hasNext = true;
//
//                    @Override
//                    public boolean hasNext() {
//                        return hasNext;
//                    }
//
//                    @Override
//                    public List<?> next() {
//                        Page<Device> page = Page.of(currentPage, pageSize);
//                        QueryWrapper queryWrapper = buildQueryWrapper(category, deviceType, deviceName, dateFrom, dateTo);
//                        Page<Device> result = deviceService.page(page, queryWrapper);
//
//                        currentPage++;
//                        hasNext = result.hasNext();
//
//                        return result.getRecords();
//                    }
//                };
//            }
//        };
//
//
//    }
//
//    /**
//     * 设置响应头
//     */
//    private void setupResponseHeaders(HttpServletResponse response, String resourceType) {
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//
//        String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
//        String filename = String.format("%s_export_%s.xlsx", resourceType, timestamp);
//
//        response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", filename));
//        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
//        response.setHeader("Pragma", "no-cache");
//        response.setHeader("Expires", "0");
//
//        log.info("设置导出响应头: filename={}", filename);
//    }
//
//    /**
//     * 处理错误
//     */
//    private void handleError(HttpServletResponse response, String message) {
//        try {
//            response.reset();
//            response.setStatus(500);
//            response.setContentType("text/plain;charset=UTF-8");
//            response.getWriter().write(message);
//            response.getWriter().flush();
//        } catch (IOException e) {
//            log.error("写入错误响应失败", e);
//        }
//    }
//
//    /**
//     * 模拟设备实体类
//     */
//    public static class MockDevice {
//        private String deviceId;
//        private String deviceName;
//        private String deviceCategory;
//        private String deviceType;
//        private String deviceModel;
//        private String deviceSecret;
//        private LocalDateTime createdAt;
//        private LocalDateTime updatedAt;
//
//        // Getters and Setters
//        public String getDeviceId() { return deviceId; }
//        public void setDeviceId(String deviceId) { this.deviceId = deviceId; }
//
//        public String getDeviceName() { return deviceName; }
//        public void setDeviceName(String deviceName) { this.deviceName = deviceName; }
//
//        public String getDeviceCategory() { return deviceCategory; }
//        public void setDeviceCategory(String deviceCategory) { this.deviceCategory = deviceCategory; }
//
//        public String getDeviceType() { return deviceType; }
//        public void setDeviceType(String deviceType) { this.deviceType = deviceType; }
//
//        public String getDeviceModel() { return deviceModel; }
//        public void setDeviceModel(String deviceModel) { this.deviceModel = deviceModel; }
//
//        public String getDeviceSecret() { return deviceSecret; }
//        public void setDeviceSecret(String deviceSecret) { this.deviceSecret = deviceSecret; }
//
//        public LocalDateTime getCreatedAt() { return createdAt; }
//        public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
//
//        public LocalDateTime getUpdatedAt() { return updatedAt; }
//        public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
//    }
//}
